﻿///////////////////////////////////////////////////////////////
// Projet serveur entreprise
// Authors: Pierre Corsini, Guillaume Blanc
// mars 2011
///////////////////////////////////////////////////////////////

using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Permissions;
using System.Threading;

namespace DLL
{
    public class ConseillerService : IConseillerService
    {

        //[PrincipalPermission(SecurityAction.Demand, Role("Customer")]
        private AccessDB _db;


        public ConseillerService()
        {
            this._db = new AccessDB();
        }

        [PrincipalPermission(SecurityAction.Demand, Role = "conseiller")]
        public bool ajouterCompte(Compte compte)
        {
            return this._db.ajouterCompte(compte);
        }

        [PrincipalPermission(SecurityAction.Demand, Role = "conseiller")]
        public bool supprimerCompte(int idCompte)
        {
            return this._db.supprimerCompte(idCompte);
        }

        [PrincipalPermission(SecurityAction.Demand, Role = "conseiller")]
        public List<Conseiller> listeConseiller()
        {
            return this._db.extraireConseillers();
        }

        [PrincipalPermission(SecurityAction.Demand, Role = "conseiller")]
        public List<Client> listeClient()
        {
            return this._db.extraireClients(Int32.Parse(Thread.CurrentPrincipal.Identity.Name));
        }

        [PrincipalPermission(SecurityAction.Demand, Role = "conseiller")]
        public List<Compte> listeCompte(int idClient)
        {
            return this._db.extraireCompte(idClient);
        }

        [PrincipalPermission(SecurityAction.Demand, Role = "conseiller")]
        public bool modifierInfoClient(Client nouveauClient)
        {
            return this._db.sauverClients(new List<Client> { nouveauClient });
        }

        [PrincipalPermission(SecurityAction.Demand, Role = "conseiller")]
        public bool sommerCompte(int idCompte, double montant)
        {
            return this.virementBancaire(idCompte, idCompte, montant);
        }

        [PrincipalPermission(SecurityAction.Demand, Role = "conseiller")]
        public bool virementBancaire(int idCompteDebiteur, int idCompteCrediteur, double montant)
        {

            //TODO Generate unic id
            int id1 = new Random().Next(Int32.MaxValue), id2 = new Random().Next(Int32.MaxValue);

            Compte to = _db.extraireCompteParId(idCompteCrediteur);
            to.Solde += montant;
            _db.sauverCompte(to);
            _db.ajouterHistorique(new Historique(id2, DateTime.Now, "Transaction", idCompteDebiteur, montant));


            if (idCompteCrediteur != idCompteDebiteur)
            {
                Compte from = _db.extraireCompteParId(idCompteDebiteur);
                from.Solde -= montant;
                _db.sauverCompte(from);
                _db.ajouterHistorique(new Historique(id1, DateTime.Now, "Transaction", idCompteCrediteur, -montant));
            }

            return true;
        }
    }
}
